引言


1. virtualenv 与 virtualenvwrapper 虚拟环境的介绍

  • 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题; 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。

  • virtualenv 或 virtualenvwrapper 是一个可以帮助我们管理不同 Python 环境的绝好工具

  • virtualenv 或 virtualenvwrapper 可以在系统中建立多个不同并且相互不干扰的虚拟环境

2. virtualenv 与 virtualenvwrapper 虚拟环境的使用场景

  • 当同时运行多个项目,项目使用了同一个模块且不同版本的时候,就可以将当前项目的所有模块下载到虚拟环境中

3. 虚拟环境的说明

  • 虚拟环境 和 虚拟环境之间只是所使用的 python 环境各不相同而已

  • 在虚拟环境下所创建的文件或文件夹可以在非虚拟环境和其他虚拟环境下使用

virtualenv


1. virtualenv 的安装

pip3 install virtualenv -i https://pypi.douban.com/simple # 使用豆瓣的镜像

2. virtualenv 的使用

  • 查看 virtualenv 的所有相关命令

virtualenv

  • 创建并且进入一个保存所有虚拟环境的文件夹

mkdir all_env

cd all_env

  • 在指定目录下创建一个虚拟环境

    • 命令: virtualenv 虚拟环境名称 --no-site-packages --python=python3

      • --no-site-packages -> 表示创建一个干净的虚拟环境 -> 即: 在创建虚拟环境的时候,只拷贝当前电脑的python环境,而不拷贝你所安装的所有第三方模块(第三方模块的存放路径: site-packages 文件夹)

      • --python=python版本 -> 指定使用哪一个python版本作为虚拟环境的解析器(即: 当前所创建的虚拟环境是使用python几的版本),前提是当前电脑已经安装了该版本的 python

[root@kevin_linux /opt/all_env 06:17:54]# virtualenv env1 --no-site-packages --python=python3


  • 进入虚拟环境

    • 进入虚拟环境文件夹下的 bin 目录

[root@kevin_linux /opt/all_env 06:29:55]# cd env1/bin

    • 执行虚拟环境文件夹下 bin 目录里的 activate 文件进入虚拟环境

[root@kevin_linux /opt/all_env/env1/bin 06:46:35]# source activate

  • 检测当前是否真的进入了虚拟环境

    • 检测命令行是否已 (虚拟环境名称) 开头

(env1) [root@kevin_linux /opt/all_env/env1/bin 06:47:07]#

    • 检测当前的 python3 是否来自于虚拟环境

(env1) [root@kevin_linux /opt/all_env/env1/bin 22:47:06]# which python3
/opt/all_env/env1/bin/python3

    • 检测当前的 pip3 是否来自于虚拟环境

(env1) [root@kevin_linux /opt/all_env/env1/bin 22:47:09]# which pip3
/opt/all_env/env1/bin/pip3

    • 对比正常环境下的 python3 和 pip3 路径

[root@kevin_linux /opt/all_env/env1/bin 22:48:52]# which python3
/opt/python36/bin/python3

[root@kevin_linux /opt/all_env/env1/bin 22:48:54]# which pip3
/opt/python36/bin/pip3

  • 检测通过后就可以在该虚拟环境中添加你所需要的模块

(env1) [root@kevin_linux /opt/all_env/env1/bin 06:47:07]# pip3 install django==1.11.20 -i https://pypi.douban.com/simple

  • 退出虚拟环境

(env1) [root@kevin_linux /opt/all_env/env1/bin 06:47:07]# deactivate

virtualenvwrapper


1. 引言

  • virtualenv 的一个最大的缺点就是:

    • 每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录。

    • 并且还有可能你忘记了虚拟环境放在哪。。。

  • virtualenv 缺点解决办法

    • 方式一: 将所有的虚拟环境目录全都集中起来存放,例如/opt/all_venv/,并且针对不同的目录做不同的事

    • 方式二: 使用virtualenvwrapper管理你的虚拟环境(virtualenv),其实它就是统一管理虚拟环境的目录,并且省去了source的步骤

2. virtualenvwrapper的安装

  • 方式一:

pip3 install virtualenvwrapper -i https://pypi.douban.com/simple  # 使用豆瓣的镜像

  • 方式二: 

    • 使用方式二的安装前提是方式一安装失败

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pbr

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps stevedore

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-deps virtualenvwrapper

3. virtualenvwrapper的配置

  • 执行 virtualenvwrapper.sh 脚本,让当前 Linux 临时支持 virtualenvwrapper

    • 注意: 当Linux重启后或者退出当前登录后,Linux 就不支持 virtualenvwrapper

virtualenvwrapper.sh  # 输入该脚本,直接回车执行

  • 配置全局变量,使其 Linux 永久支持 virtualenvwrapper

    • 让 Linux 每次启动都会加载 virtualenvwrapper

    • 在用户全局环境变量文件中进行配置,也可以在全局环境变量文件中进行配置

    • 为什么要在用户全局环境变量文件中进行配置?

      • 因为用户全局环境变量可以根据用户的不同使用不同的变量(即: 如果将 virtualenvwrapper 配置在 root 的用户全局环境变量下,那么只有 root 用户可以使用 virtualenvwrapper)

      • 全局环境变量就是任何用户都可以使用的,没有任务限制

    • 进入用户全局环境变量文件

vim ~/.bashrc

    • 在用户全局环境变量文件的底部写入你要定义的变量

export WORKON_HOME=/root/Envs  # 设置 virtualenv 的统一管理目录(即: 设置虚拟环境的统一管理目录)

export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'  # 添加virtualenvwrapper的参数,创建一个干净的虚拟环境 -> 即: 在创建虚拟环境的时候,只拷贝当前电脑的python环境,而不拷贝你所安装的所有第三方模块

export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3  # 指定 python 解析器的路径(即: 使用哪一个版本的 python 作为虚拟环境的 python 环境)

source /opt/python36/bin/virtualenvwrapper.sh  # 执行 virtualenvwrapper 的安装脚本 virtualenvwrapper.sh,且该脚本在你所安装的python目录下的bin目录下


    • 重新执行用户全局环境变量文件,使其生效

source ~/.bashrc

  • 配置成功后就会在你指定的目录下创建一个 virtualenv 的统一管理目录


4. virtualenvwrapper的使用

  • 创建并且进入虚拟环境

    • 可以在虚拟环境和非虚拟环境下执行

    • 你所创建的虚拟环境会自动放到你所指定的 virtualenv 的统一管理目录下

mkvirtualenv env1

  • 退出虚拟环境

    • 需要在虚拟环境下执行

deactivate

  • 进入或切换虚拟环境

    • 可以在虚拟环境和非虚拟环境下执行

    • 命令: workon 虚拟环境名

workon env1

  • 删除虚拟环境

    • 需要在非虚拟环境下执行(即: 需要退出当前的虚拟环境才能执行)

    • 命令: rmvirtualenv 虚拟环境名 

rmvirtualenv env2

  • 查看所有已经创建虚拟环境

    • 可以在虚拟环境和非虚拟环境下执行

lsvirtualenv

  • 切换到当前虚拟环境的所在目录下

    • 需要在虚拟环境下执行

cdvirtualenv


  • 切换到当前虚拟环境下的 site-packages 目录下,且 site-packages 是存放所下载的模块的地方

cdsitepackages


  • 显示当前虚拟环境的所有模块(即: 显示当前虚拟环境下 site-packages 文件夹的所有内容,且 site-packages 是存放所下载的模块的地方)

    • 需要在虚拟环境下执行

lssitepackages